/**
 * @author cj
 * @time 2023-1-1 13:20
 * @description 封装axios
 */
 // 1.引入axios
import axios from 'axios'
import store from '@/store'
import { LOGIN_API } from '@/config/urls.conf'
import { JOIN, LOGIN_FLAG } from '@/config/common.conf'
 // 2.创建axios实列 AXIOS 并且实现通用配置
 const Axios = axios.create({
    baseURL: '/shudao',
    timeout: 5000
 })

 // 3.定义不需要拦截的地址
 const noLoginUrl = [
    // 。。。
    LOGIN_API
 ]

 // 多服务器代理？

 // 请求拦截
Axios.interceptors.request.use(function(config) {
    // 如果请求地址包含在不需要登录的地址数组中 则直接放行
    if(noLoginUrl.includes(config.url)) {
        return config
    }
    // 要从store内拿取token
    let token = store.getters['common/token']
    // 如果拿不出来token或者为空提示登录问题
    if(!token) {
        return Promise.reject({code: 400, message: '登录状态异常或者Token存在问题！请重新登录尝试'})
    }
    // 有token的话 加入请求头 接口要求叫做 X-Token
    config.headers['X-Token'] = token
    return config
})

// token 续期？
Axios.interceptors.response.use(response => {
    if (response.data.code === 400 && response.data.message === "token票据已过期，请重新登录") {
        router.push('/login')
    } else {
        if (!noLoginUrl.includes(response.config.url)) {
            let cache = sessionStorage.getItem(LOGIN_FLAG)
            try {
                cache = deCodeApi(cache).split(JOIN)
                sessionStorage.setItem(LOGIN_FLAG, enCodeApi(cache[0] + JOIN + Date.now()))
            } catch {

            }
        }
    }
    return response
})

// 封装axios请求
/**
 * 
 * @param {{url: String, method: 'GET' | 'POST' | 'DELETE' | 'PUT', data?: any, params?: any}} req 请求对象
 * @returns 
 */
function ajax(req){
    return  new Promise(resolve => {
        Axios.request({
            url: req.url,
            method: req.method || 'GET',
            data: req.data || {},
            params: req.params || {},
        }).then(({data}) => {
            resolve(data)
        }).catch(e => {
            resolve(e)
        })
    })
}

// 导出
export default ajax